﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Npgsql;
using System.Text.RegularExpressions;

namespace Golfvision2020
{
    public partial class Inloggning : Form
    {
        private NpgsqlConnection connection;
        public bool Inloggad = false;
        public bool Admin = false;
        public String Golf_id = "-1";


        public Inloggning(NpgsqlConnection conn)
        {
            InitializeComponent();
            connection = conn;
        }

        private void OnKey(object sender, System.Windows.Forms.KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)13) // Enter var tryckt
            {
                KontrolleraInloggning();
            }
        }

        private void KontrolleraInloggning()
        {
            if (Namn.Text == "")
            {
                MessageBox.Show("Namnfältet får inte vara tomt");
                Namn.Select();
                return;
            }

            if (Lösen.Text == "")
            {
                MessageBox.Show("Lösenordsfältet får inte vara tomt");
                Lösen.Select();
                return;
            }

             // Kolla så att boxarna inte innehåller specialtecken
            if (Regex.Match(Lösen.Text+Namn.Text, @"[^a-zåäöA-ZÅÄÖ0-9_\s]").Success)
            {
                MessageBox.Show("Textboxarna får inte innehålla specialtecken");
                return;
            }

            String golf_id;
            String persnr;
            if (Namn.Text == "admin")
            {
                golf_id = "15";
                persnr = "0";
            }

            else if (Namn.Text == "banpersonal")
            {
                golf_id = "16";
                persnr = "1";
            }

            else if (Namn.Text == "tävlingsledare")
            {
                golf_id = "17";
                persnr = "2";
            }

            else {
                String[] str = Namn.Text.Split('_');
                if (str.Length != 2) {
                    MessageBox.Show("Felaktigt användarnamn eller lösenord.");
                    return;
                }
                persnr = str[0];
                golf_id = str[1];
            }


            String sql = String.Format(@"SELECT losenord FROM spelare 
                                       WHERE personnummer='{0}' AND golf_id={1};",
                                       persnr, golf_id);
            NpgsqlCommand cmd = new NpgsqlCommand(sql, connection);
            NpgsqlDataReader dr = cmd.ExecuteReader();

            
            String md5sum = GetMD5Hash(Lösen.Text);

            if (dr.HasRows && dr.Read() && md5sum == dr["losenord"].ToString())
            {
                Inloggad = true;
                if (Namn.Text == "admin" ||
                    Namn.Text == "banpersonal" ||
                    Namn.Text == "tävlingsledare")
                {
                    Admin = true;
                }

                Golf_id = golf_id;
                dr.Close();
                this.Close();
            }
            else
            {
                dr.Close();
                MessageBox.Show("Felaktigt användarnamn eller lösenord.");
                return;
            }
        }

        private void LogInbutton_Click(object sender, EventArgs e)
        {
            KontrolleraInloggning();
        }


        public string GetMD5Hash(string input)
        {
            System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider();
            byte[] bs = System.Text.Encoding.UTF8.GetBytes(input);
            bs = x.ComputeHash(bs);
            System.Text.StringBuilder s = new System.Text.StringBuilder();
            foreach (byte b in bs)
            {
                s.Append(b.ToString("x2").ToLower());
            }
            string password = s.ToString();
            return password;
        }
    }
}
